/* 依次顺序执行一系列任务* 
  所有任务全部完成后可以得到每个任务的执行结果*
  需要返回两个方法，start用于启动任务，pause用于暂停任务*
  每个任务具有原子性，即不可中断，只能在两个任务之间中断
 @params [...Function} taskg 任务列表，每个任务无参、异步
  **/
function processTasks(tasks) {
  // 控制任务是否执行
  let isRunning = false;
  // 记录成功的执行结果
  let successList = [];
  // 记录失败的任务
  let failList = [];
  // 记录执行位置
  let index = 0;

  return {
    async start() {
      return new Promise(async (resolve, reject) => {
        // 执行中的话，不可多次开启
        if (isRunning) return;
        isRunning = true;

        while (index < tasks.length) {
          try {
            const res = await tasks[index]();
            console.log("执行", index);
            successList.push(res);

            // 如果中途暂停了，则直接返回,注意位置要放await后面，因为任务原子性，不能执行中暂停，只能在两个任务中间暂停
            if (!isRunning) {
              return;
            }
          } catch (error) {
            failList.push(error);
          }
          index++;
        }
        resolve([successList, failList]);
      });
    },
    pause() {
      console.log("暂停");
      isRunning = false;
    },
  };
}

// egg

function getPromiseList(n) {
  let list = [];
  for (let i = 0; i < n; i++) {
    function a() {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve();
        }, i * 1000);
      });
    }
    list.push(a);
  }

  return list;
}

let list = getPromiseList(5);

let processObj = processTasks(list);

processObj.start();

setTimeout(() => {
  processObj.pause();
}, 2000);
setTimeout(() => {
  processObj.start();
}, 3000);
